package com.hq.cms.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import com.hq.cms.dao.UserInfoDAO;
import com.hq.cms.domain.User;
import com.hq.cms.metas.Gender;
import com.hq.cms.service.UserInfoService;
import com.hq.cms.utils.AssertUtil;
import com.hq.cms.web.forms.UserForm;
@Service
public class UserInfoServiceImpl implements UserInfoService {
	@Resource
	private UserInfoDAO userInfoDAO;
	
	/*
	 * 在业务层：1：验证2：转移数据 3：加密
	 *将userForm对象  进行 验证 通过 断言的方式进行验证
	 */
	@Override
	public int reg(UserForm userForm) {
		//1:验证用户名：
		String username = userForm.getUsername();
		AssertUtil.hasLength(username, "用户名不能为空");
		//2:验证密码不能为空
		String password = userForm.getPassword();
		AssertUtil.hasLength(password, "密码不能为空");
		//3: 密码与确认密码是否一致
		String rePassword = userForm.getRePassword();
		AssertUtil.isTrue(password.equals(rePassword), "密码与确认密码不一致");
		//4: 性别做验证
		Gender gender = userForm.getGender();
		AssertUtil.isTrue(gender!=null, "性别必选");
		//5:用户名唯一性验证
		//将用户名通过后台获取 是否有注册测名字
		//起始就是通过用户名到后台获取总数  如果大于0 不允许注册 如果等于0 可以注册
		int count=userInfoDAO.getCountByUserName(username);
		AssertUtil.isTrue(count==0, "用户名已存在");
		
		// 转移数据 将userForm 数据转移到 user中
		User user = new User();
		user.setUsername(userForm.getUsername());// 设置用户名
		user.setGender(userForm.getGender());	// 设置性别
		// 设置密码 加密
		String new_password = UserInfoService.encrypt(userForm.getUsername(), userForm.getPassword());
		user.setPassword(new_password);
		// 昵称  因为没有在注册是设置昵称所以  昵称就是用户名
		user.setNickname(userForm.getUsername());
		// 设置是否锁定
		user.setLocked(false);
		user.setCreated(new Date());// 注册时间 就是当前时间
		user.setUpdated(user.getCreated()); // 修改时间 就是注册时间
		
		
		return userInfoDAO.reg(user);
	}

	/*
	 *  登录操作 需要处理
	 *	1：验证：用户名与密码不能为空
	 */
	@Override
	public User log(UserForm userForm) {
		//1:验证用户名：
		String username = userForm.getUsername();
		AssertUtil.hasLength(username, "用户名不能为空");
		//2:验证密码不能为空
		String password = userForm.getPassword();
		AssertUtil.hasLength(password, "密码不能为空");
		// 通过用户名获取  后台数据
		// 1:数据库查询只查username   2：数据库查询查找 username和password
		User user=userInfoDAO.getUserByUsername(userForm.getUsername());
		// user中密码是 加密后的
		// 所以需要 将userForm中的密码也进行加密 才能与user的密码进行比对
		String form_password = UserInfoService.encrypt(userForm.getUsername(), userForm.getPassword());
		AssertUtil.notNull(user, "用户名或密码错误");
		AssertUtil.isTrue(user.getPassword().equals(form_password), "用户名或密码错误");
		//用户是否锁定的验证  
		AssertUtil.isFalse(user.getLocked(), "当前用户已被封 解封请联系管理员");
		
		//这个target对象 目的是为了 向前台传递数据  但是
		// 不传递密码等保密信息 所以用了一个新的对象
		User target=new User();
		// 登录操作
		if(user.getPassword().equals(form_password)) {
			BeanUtils.copyProperties(user, target, "password");
		}
		return target;
	}

	@Override
	public List userManager(Map map) {
		// TODO Auto-generated method stub
		return userInfoDAO.userManager(map);
	}

	@Override
	public int changeLocked(Integer id) {
		// TODO Auto-generated method stub
		return userInfoDAO.changeLocked(id);
	}

}
